package com.example.demo.leetcode.top;


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 *
 *给定一个二叉树，检查它是否是镜像对称的。
 *
 *  
 *
 * 例如，二叉树 [1,2,2,3,4,4,3] 是对称的。
 *
 *     1
 *    / \
 *   2   2
 *  / \ / \
 * 3  4 4  3
 *  
 *比如看下面这两个子树(他们分别是根节点的左子树和右子树)，能观察到这么一个规律：
 * 左子树 22 的左孩子 == 右子树 22 的右孩子
 * 左子树 22 的右孩子 == 右子树 22 的左孩子
 *
 *          1
 *       /     \
 *     2         2
 *    / \       / \
 *   3   4     4   3
 *  / \ / \   / \ / \
 * 8  7 6  5 5  6 7  8
 *
 *
 *     1
 *    / \
 *   2   2
 *    \   \
 *    3    3
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/symmetric-tree
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Btree_对称二叉树 {


 public static class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;

     TreeNode() {
     }

     TreeNode(int val) {
         this.val = val;
     }

     TreeNode(int val, TreeNode left, TreeNode right) {
         this.val = val;
         this.left = left;
         this.right = right;
     }

 }

    public static boolean isSymmetric(TreeNode root) {

        return dfs(root.left,root.right);
    }

    public static boolean dfs(TreeNode left,TreeNode right){

     if(left == null && right == null){
         return true;
     }
     if(left !=null && right == null){
         return false;
     }
     if(left == null && right != null){
         return false;
     }
     if(left.val != right.val){
         return false;
     }
     //比较左子树的左孩子 和右子树的右孩子
     //比较左子树的右孩子 和右子树的左孩子
      return dfs(left.left,right.right) & dfs(left.right,right.left);
    }



    public static void main(String[] args) {
        TreeNode node = new TreeNode(1);
        TreeNode node2 = new TreeNode(0);

//
        node.left=node2;

        System.out.println(isSymmetric(node));;

        List<Integer> list = new ArrayList<>();
        list.add(0);
        list.add(3);
        list.add(0);
        list.add(3);


    }


}
